图形学基础 真假位移(法线贴图、凹凸贴图和位移贴图、向量位移贴图的对比与区别) |
您所在的位置:网站首页 › 纹理贴图 英文 › 图形学基础 真假位移(法线贴图、凹凸贴图和位移贴图、向量位移贴图的对比与区别) |
写在前面:
本文是在阅读了知乎题目为《高度图,视差贴图(Bump-maps),置换贴图(displacement),法线贴图的本质》一文后,对翻译内容有些疑问,故而去查阅原文,做出的翻译。翻译一法,仁者见仁,智者见智,在参考我的翻译之后如果发现有任何不准确之处,欢迎指正,同时也推荐去查阅知乎相关帖子,或者直接去阅读A站英文原文。 https://www.artstation.com/andreasmischok/blog/jzWz/fake-vs-true-displacement-part-12 至于我写这篇翻译的目的,是希望能够清晰得掌握(或者说确立)自己对于中文相应概念的对应,同时进行知识巩固。 注意: 翻译主要是基于我的英文水平,外加google翻译和维基百科的参照。 在翻译中每当出现新的技术名词,我都会将其列在文中,以小括号()进行区别。同时,我也会在内容中利用一些小括号补充我对于特定内容的理解和理论,不一定正确,仅仅是基于我在图形学浅薄的研究。我并不是图形学或者翻译学的权威,所以我建议是在参考这篇翻译的同时,对英文概念进行掌握。 正文: 虚假 vs 真实位移(Fake vs True Displacement)凹凸贴图(bump-maps),法线贴图(normal-maps),位移(displacement)和向量位移贴图(vector displacement)。到现在你可能已经至少遇到过其中的某一个。虽然现在已经有很多关于他们的信息可供查询,但是看起来关于他们的区别和使用某一种特定类型贴图的效果仍然存在一些混淆和误解。这篇文章将会主要集中精力于需要注意的问题点,而不是具体如何去实现某一个效果。 上述四种纹理类型有一个共同的目的——为模型添加更多的表面细节,当然具体使用的方法各有不同。说到具体的方法,他们可以细分为两个大类,我将会称他们为真实的位移(true displacement)和虚假的位移(fake displacement)。单词“位移displacing”只是“移动moving”的同义词,这正指出了我们要讨论的区别的核心。真实的位移将会真正对顶点(vertices)进行移动,而虚假的位移则是在不改变集合的情况下尽力到达相同的显示效果。现在,我将集中于这两类贴图的区别,而不是将每个贴图类型都分开来分析。
注:这里提一下高度图(height-map)。高度图一词描述了信息和数据是如何进行存储的,而不是它如何应用于网格之上。它可以作为凹凸贴图或位移贴图来进行使用。像Substance这样的软件会使用这个术语,因为软件本身并没有作出相关的声明,即你应该将高度图用作真实的位移或虚假的位移。* 在我们进一步讨论之前,我应该说明,作为一个特效师(vfx artist, 全称visual effect artist),我将会从视觉效果的视角并且使用路径追究渲染(path tracing rendering,与传统光栅化相对应)的方式来看待这个问题。如果你是使用不同的渲染方法(如游戏引擎),你得出的结果可能会不一样。真实的位移甚至有可能完全由引擎所支持。(译者注:这里译者的理解是,引擎所用的渲染并不是理论上的完全的光栅化或者完全的光追,而是某种针对平台进行过特定优化和改动的渲染模型。) 要理解虚假的位移是如何工作的,我们需要首先快速得过一遍路径追踪。简单来看:光线由场景中得光源发出,并在物体表面进行进行反弹直到他们到达相机。或者另一种,光线可能由相机出发并弹射直到到达光源。当然,无论是使用哪一种方式,都不会对我下面那要演示的效果产生影响。(译者注:真正的光追,除了考虑反射,还要考虑光线散射所需要消耗的光量,具体可以参考光辐射学)。 反射光线(reflected ray)的角度可以通过比较入射光线(incoming/incident ray)的角度和表面法线(surface normal)的角度从而计算得到。你们当中那些在学校学过向量数学的并且记性好的人,应该会认出“Normal”一词。在向量数学中(渲染的核心和基础),法线就是垂直于平面的向量。简单来将,我们可以说我们模型上的每一个面都是一个平面,因此每个面都有一个对应的法线。(译者注:对于没有基础或者遗忘了的人,向量可以理解为只有方向和长度的一个几何量,对应的单位向量就是单位长度的具有某一个方向的向量。)
法线贴图之所以这样命名是因为他们允许以像素的维度存储一个自定义的表面法线。这意味这你可以自由地操纵光线的弹跳方向,而无需改变几何形体。同样这意味着对于光线来说,法线贴图和凹凸贴图看起来是一样的。
对灯光的影响 在观察例子时你观察到的第一个事情可能会是阴影(shadows)的缺失。真实的位移不仅会影响基本网格体产生的阴影的形状,它还可以创建新的形状,并产生完全的新的阴影。这一阴影可能会产生在自生身上(self-shadowing),同样也可能会投射到别的物体身上。 体现这种效果的一个很胖的例子是创建一面砖墙,当然是一个平面基础几何去体现。使用真实的位移,墙壁缝隙间的阴影会赋予墙面一个很强烈的深度的感觉,而没有这些阴影的情况下(应用虚假的位移)会导致看上去很平坦。 但是还需要说清楚一点,阴影的缺失并不是与光线交互中唯一的视觉上的区别。在不常规的真实的位移情况下,我们会增加物体的表面,这会导致更大数量的反弹光。这会导致黑暗区域在使用虚假的位移时看起来是不太自然的黑。
我到目前为止所提到的所有效果都会受到入射光的角度与相机角度的影响。如果你的相机与光源对齐,那么所有这些效果似乎都会消失。例如,阴影的变形会减少,因为相机的视图也会发生同样的变形。 观察最后的渲染,你可能已经注意到别的一些东西了。虽然法线贴图重现了相同的亮度值,但金字塔看起来仍然非常平坦。这是由于下面我要介绍的一个效应。 视差(Parallax) 作为透视的主要原理之一,视差描述了在移动相机时物体之间产生的看似相互移动的视觉效应。它不限于单独的分离的物体对象,它也会发生在3D空间中的任意两个给定的点。这意味着使用真实的位移的网格变形会对它产生影响。 奇怪的知识点:一些艺术家在一些真正有趣的方式来使用视差。一个很好的例子是Patrick Hughes。参看下面的视频,其中展示他的其中一件作品。 https://youtu.be/cDGlprrEPv4 90度角 可以使用真实的位移创建90度垂直偏移,相对的,在虚假的位移里则无法有相同的效果。从理论上来讲,垂直角度可以存储在法线贴图中,但这样做并没有任何意义,因为他们在逻辑上不会在低多边形网格上有任何相对应的区域。 轮廓(sihouette) 当只看轮廓时,虚假的位移不会改变几何形状也特别明显。在极端情况下,内部重叠甚至可能发生同样的情况,例如鼻子覆盖角色脸颊的一部分。 通常,有两种方法可以看到这种效果。应该柔和的轮廓变成块儿状或者说,应该有很多高频细节的轮廓突然缺少上述的细节。 如果你正在处理的资产应用到了SSS,那么你也可能察觉到虚假的位移的另一个缺点。 黑色区域或被拉伸的反射 除了因缺乏弹射光而引起的不自然的黑暗区域外,还有另一种影响导致类似的缺陷。使用虚假的位移时,表面法线和光线角度的某种特定组合可能导致反射光线,而这条反射光线的路径则需要穿过物体本身的表面。 直接消灭光线 以不同的方式重定向光线 在这些不正常的区域忽略掉法线贴图 Arnold就是其中的一个引擎,它只简单地杀死那些产生错误的光线,导致部分黑色反射(partially black reflection 译者注:即无反射产生)。在另一方面,真实的位移则会使光线从物体表面多进行几次反弹。 镜面粗糙度是在微观层面模仿表面不完美性,这是通过对反射的角度添加随机偏移而做到的。表面越粗糙,可能的偏移范围就越大。
介电材料会以一个完全随机的角度反射大部分击中他们的光线,这被称为漫反射(diffuse reflection),只有很小一部分被反射为镜面反射。这意味着即使表面完全光滑,问题也几乎不会引起注意。 曲面细分(Tessellation / Subdivision) 到目前为止,我提到的所有缺陷都是关于虚假的位移,但是接下来的是关于使用真实的位移的一个缺陷。 仅真实的位移就只能创建/重新创建多边形所支持的细节量。这意味着我们首先必须对网格进行细分。如果我们细分得不够充分,我们最终可能会得到一个无法支持存储在我们的纹理中的所有更精细的细节的几何体。这意味着你可能需要大量细分你的模型,从而致使场景变得非常繁重。幸运的是,渲染引擎现在某些特性。这些特性允许渲染引擎自动添加无法被几何体支持的细节,像虚拟的位移这样的。在某些渲染器中,此功能默认禁用,因此请检查该功能。令人讨厌的是,目前还没有任何标准化的命名约定。例如,Arnold称它为Autobump,而Cycle渲染引擎则称它为位移+凹凸(displacement + bump)。 初步对该功能进行体验,请查看下面的比较,这两个网格被细分了三次,但是只有组合的方法可以提供所有细节。 特别是当你开始的时候,通过创建比较渲染来确保一切按预期运行是个很好的做法。一个使用Autobump结合你预期的细分的次数和一个没有Autobump,但是有着非常高的细分量,以此来确保结果正确匹配。 注意在某些渲染器中,必须要单独启动带有SSS着色器(shader)的Autobump。使用虚假的位移的问题仍将发生在那些由Autobump功能添加的细节上,即使在毛孔等细微的细节上它们不会很强大。 结论 真实的位移和虚假的位移都是增加模型保真度的好方法。 我有意使用了非常有力的例子来非常清楚地展示所有的缺陷。但是 不要让这些成为你拒绝使用虚假的位移贴图(例如法线贴图)的理由。(译者注:他们都有他们存在的意义和必要。) 基本规则是,你的纹理越是发挥全部的效力,缺陷就会愈加明显。 因此,无论你要使用哪种方法,都应始终尝试使用基本拓扑捕获所有定义的形状。 在使用虚假的位移时这非常重要,但在使用真实的位移时也同样很重要。 如果你遵循这个简单的规则,那么两种方法都可以达到几乎相同的结果。 你能发现下图中哪些使用了真实的位移,哪些使用虚假的位移吗? 另一方面,如果您正在处理主角资产,使用真实的位移仍然可能是最佳的选择,因为它会简单地呈现更清晰的结果。即使在我向您展示的上一个渲染中,这两种方法在质量方面仍然存在一些差异。 但是规则也有例外。例如,如果你的时间安排非常紧凑,那么使用虚假的位移而不是真实的位移可以帮助你加快渲染速度。并且由于你将需要渲染序列,因此,与每个额外帧做乘法的渲单位渲染时间也会更短。 或者我们假设你需要一种特定的材质,并且你可以在线上找到的所有优质纹理仅仅是一个法线贴图,并且你也没有时间去自己创建材质。在这种情况下,即使你的资产是主角资产,你也可能要用一种使用法线贴图的材质。许多扫描材料可能就是属于这种情况,因为捕获高质量的法线贴图比创建高质量的位移贴图更快更容易。如果你对如何完成此操作感兴趣,那么下面的文章可能对您很有趣。 (不建议使用智能手机阅读) https://magazine.substance3d.com/your-smartphone-is-a-material-scanner-vol-ii/ 即使你由更复杂的3D形状,例如人脸,类似的技术也可以用来创建高质量的法线贴图。 译者的思考:自己在有些时候会有看文章不带脑子的,做一些书籍或者是帖子翻译的目的是希望自己能够去思考所阅读的东西。比如说displacement map一词,我在阅读国内帖子和文章时候,有时候会读到“位移贴图”,而有时则是“置换贴图”,这使我在做概念对应的时候产生了一些误解。但是真正去理解,或者说定义一个词的并不是找一个合适的翻译就好了,无论是“置换”也好,“位移”也罢,并不能通过一个字面翻译就完整得传达这个技术点的原理。我希望大家在读过文章之后,说起displacement map,脑子里出现的并不是“位移”或是“置换”,而是这背后的运行于理论空间的模型,这样可能才不枉费花费的阅读时间。 当然,最后的最后,虽然这是一篇外文的翻译,也希望大家不要迷信外文,google有google的好,百度也有百度的便利。不做知乎口头王者,不做论坛洗地水军。多方参照、有自己的理论体系、有自己的坚持和思考才是学习的正确方法。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |